{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Introduction aux outils de python\n", "
\n", "

Navigation dans la page

\n", "

\n", " Si c'est votre première visite dans ce TP, lisez attentivement chacun des points détaillé après ce paragraphe.
\n", " Si vous avez déjà commencer à travailler sur ce TP et que vous souhaiter vous déplacer rapidement dans une partie précise vous pouvez choisir la partie que vous souhaitez rejoindre ci-dessous.
\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

\n", "\n", "
\n", " Technologie jupyter\n", "

\n", " La technologie jupyter permet d'exécuter du code python par un simple clique sur Executer ci-dessus.
\n", " Les morceaux de code de cette page sont interprétées case par case. Pour savoir quelle case a été interprétée avant une autre, il suffit de repérer le numéro devant la case.
\n", " Une fois qu'une case a été interprétée (=exécutée), la page garde en mémoire les variables et fonctions lues
\n", " La plateforme propose quelques outils de purge de la mémoire : \n", "

\n", "

\n", "
\n", "

SAUVEGARDER VOTRE TRAVAIL

\n", "

\n", " Pour ne pas perdre votre travail pensez à le sauvegarder régulièrement. Par défault, la sauvegarde par un clic sur la disquette en haut à gauche de page, ou par le racourci clavier classique ctrl+S\n", " est une sauvegarde en local, sur le serveur de jupyter. Vous pouvez et devez très régulièrement sauvegarder votre travail sur votre support personnel de sauvegarde (clef USB, se l'envoyer par mail etc). Ce faisant vous disposerez d'un fichier .ipynb (IPYthon NoteBook) qu'il vous suffira de recharger pour avancer. Après le rechargement assurez vous que les fonctionnalités anciennement developpées et variables utilisées sont bien dans la mémoire de la page (en rééxecutant les cases, ou plus rapidement par Kernel > Restart & Run All.

\n", "

A NOTER : vous pouvez travailler sur le tp (et tout autre fichier .ipynb) hors connexion en installant une version local du notebook de jupyter. Il faut que votre machine possède un interpreteur de python et que vous soyez connecter à internet.\n", "

    \n", "
  1. Lancer un terminal
  2. \n", "
  3. Taper la commande suivante : pip install jupyterlab
  4. \n", "
  5. Une fois l'installation terminée portez votre attention sur les dernières lignes affichées dans votre terminal vous invitant probablement à taper une ligne de commande pour faire une mise à jour
  6. \n", "
  7. Pour lancer notebook de jupyter, taper dans votre termial : jupyter notebook
  8. \n", "
  9. Votre simulateur de serveur est lancé. Il ne faut pas fermer votre terminal, auquel cas votre simulateur de serveur s'interompera. Suivez le lien indiqué dans les dernières lignes de votre terminal pour vous diriger vers votre espace local. L'interface se présente comme celle que vous trouverez sur le web. Votre travail sera cependant toujours enregistré et jamais perdu même si vous le consultez après plusieurs jours
  10. \n", "
\n", "

\n", "
\n", "
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Python comme une calculatrice\n", "
\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Fan de la série télévisé des Monty python, Guido van Rossum, crée à la fin des années 80 un langage de programmation alors qu’il travaillait sur un autre. Il s’inspire de ce que les langages offrent de mieux à son époque et parvint à faire adopter\n", "ce langage à ses collègues de travail. Deux années après sa création, Python est rendu publique en open source. Ce langage a bénéficié de nombreuses avancées par de nombreux collaborateurs (comme la DARPA pour n’en cité qu’un) et a été entre autre pensé pour l’enseignement de l’informatique.

\n", "\n", "

Comme tout bon langage de programmation, il est de prime abord une calculatrice sophistiquée.

\n", "\n", "

Exéctuer la case suivante pour réaliser une simple addition.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "2+3" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Comme vous l'observez, le mot Out est apparu à gauche. En effet, nous avons demandé à notre langage, python, de réaliser l'opération $2+3$ ; sans plus. C'est Jupyter (la plateforme que nous utilisons ici) qui comprend que nous souhaitons réaliser une addition et la voir apparaitre. Comme jupyter est aussi gentil que python, il prend l'initiative de nous afficher la réponse. Nous allons revenir sur cette prise d'initiative (non mais oh !) mais explorons les différentes opérations que nous pouvons réaliser sur les nombres.

\n", "\n", "

\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
+pour l'addition
-pour la soustraction
*pour la multiplication
/pour la division à virgule flottante
//pour la division entière (sans partie décimale)
%pour le modulo (le reste de la division euclidienne)
**pour la puissance
\n", "

\n", "\n", "

Exercice

\n", "De tête, anticipez le résultat des opérations suivantes, et vérifiez vos résultats en tapant votre opération dans la case suivante.\n", "
    \n", "
  1. 2020-5
  2. \n", "
  3. 2020//5
  4. \n", "
  5. 2020/5
  6. \n", "
  7. 2020%5
  8. \n", "
  9. 2**5
  10. \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Attention au arrondis

\n", "

Comme tout logiciel de calcul, python réalise des erreurs d'approximation, parfois surprennante. Observer l'exécution de la case précédente.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Les erreurs d'arrondis sont très insignifiantes mais très courrantes en informatique (pas qu'en python). Il faut garder en tête que lorsque les programmes indiquent que le résultat est 0, il s'agit en fait d'une valeur approchée de ce nombre.

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Python et l'écriture scientifique

\n", "

Python gère très bien l'écriture scienfique (avec ses erreurs d'arrondis intrinsec à tous les langages). Exécuter la case suivante.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "1.1234e-2+0.001" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Réaliser les opérations suivantes :\n", "

    \n", "
  1. $3.14\\ E\\ -2020+1\\ E -2019$
  2. \n", "
  3. $3.14\\ E\\ -20+1\\ E -19$
  4. \n", "
  5. $3.14\\ E\\ 20+1\\ E 19$
  6. \n", "
  7. $3.14\\ E\\ 2020+1\\ E 2019$
  8. \n", "
\n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Les fonctions classique

\n", "

Comme n'importe quelle calculatrice, nous souhaitons pouvoir utiliser des fonctions comme le cosinus, la racine carré, le logarithme etc. Pour pouvoir utiliser ces fonctionnalités dites avancées il faut les charger dans le programme. Autrement dis : pour calculer la racine carré de $2$, il faut écrire un programme de calcul de la racine carré. Fort heureusement d'autre s'en sont déjà occupé ! Le fait de charger cette fonction reviens à aller chercher le code d'autre programmeur et de simplement l'utiliser. Toutes les fonctions mathématiques dont nous pourrions avoir besoin sont rangé dans une bibliothèque : math (original). Exécuter la case suivante pour charger les fonctions de math.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from math import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Une fois chargée, voici ce que vous pouvez à présent faire:\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
MathématiquesPython
$|x|$abs(x)
$\\sqrt{x}$sqrt(x)
$e^x$exp(x)
$ln(x)$log(x)
$log(x)$log10(x)
$cos(x)$cos(x)
$sin(x)$sin(x)
$tan(x)$tan(x)
$\\pi$pi
$e(=e^1)$e
$x^y$pow(x, y)
$n!$factorial(n)
\n", "\n", "

\n", "

Exercice

\n", "
    \n", "
  1. Donner une valeur approchée de $\\sqrt{2}$.
  2. \n", "
  3. Donner une valeur approchée du nombre d'or $\\dfrac{1+\\sqrt{5}}{2}$.
  4. \n", "
  5. Donner une valeur approchée de $cos(6*6*6)$.
  6. \n", "
  7. Donner une valeur approchée de $sin(666)$.
  8. \n", "
  9. Donner une valeur approchée de $tan\\left(\\dfrac{\\pi}{2}\\right)$.
  10. \n", "
  11. Donner la valeur de $1983!$.
  12. \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Un peu plus qu'une calculatrice

\n", "

Python peut faire bien mieux (et encore plus que ça) que ces opérations élémentaires. Le premier point important c'est que l'on peut stocker le résultat d'une opération dans une variable et utiliser cette variable pour d'autres opérations.
Pour utiliser une variable rien de plus simple : il faut la déclarer en la nommant et l'initialiser en lui attribuant une valeur. Il y a bien deux étapes pour jouer avec une variable : \n", "

\n", " Ainsi x=0 fera exister une variable x qui aura la valeur 0. On peut ensuite faire sur x toutes les opérations que l'on souhaite (celle que l'on a vu plus haut) avec des valeurs numériques ou d'autres variables (qui contiennent des valeurs numérique).\n", "

\n", "\n", "

Pour afficher une ou plusieurs variables on utilise la fonction print (nous reviendrons sur la notion de fonction). Par exemple la commande print(x) affichera la valeur de la variable x (si elle existe dans le code ; une erreur sinon). De même print(x, y, 0, z) affichera la valeur de x, de y, le nombre 0 et la valeur de z.

\n", "\n", "

Exercice

\n", "

Lisez attentivement le code suivant et anticiper la valeur de x. Vérfier votre résultat en exécutant les deux cases suivantes.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=0\n", "a=1\n", "b=-1\n", "a=a+2*x\n", "x=a\n", "a=2*b-3*x\n", "x=a\n", "a=x" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Un dernier commentaire

\n", "

Lorsque nous réaliserons des codes un peu plus sophistiqué, il pourra être raisonnable de les commenter (pour comprendre ce qui nous est passé par la tête au moment de son ériture, ou si quelqu'u d'autre doit lire notre code).\n", "En python, il existe deux manière de faire un commentaires : \n", "

    \n", "
  1. Sur une ligne : il suffit de placer un # pour que tout ce qui suit ce symbole soit ignoré, jusqu'à la fin de la ligne.
  2. \n", "
  3. Sur plusieurs lignes : il suffit de placer trois guillemets (du 4) ''' pour que tout ce qui suit ces symboles soit ignoré jusqu'au prochain triple guillemets.
  4. \n", "
\n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "'''Voici un code commenté\n", "Il s'agit de l'exercice précédent '''\n", "#Initialisation\n", "x=0\n", "a=1\n", "b=-1\n", "\n", "#Opérations\n", "a=a+2*x #a est écrasé par a+2x soit 1+2*0=1. a vaut 1\n", "x=a #x est écrasé par la valeur de a. x vaut 1\n", "a=2*b-3*x #a est écrasé par 2b-3x=2*(-1)-3*1=-5\n", "x=a #x est écrasé par a. x vaut -5\n", "a=x #a est écrasé par x. a vaut -5\n", "\n", "#Affichage\n", "print(x)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Le calcul propositionnel en python\n", "
\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Un proposition est un énoncé dont on peut dire sans ambiguïté qu'il est vrai ou qu'il est faux. En python le vrai et le faux sont représentés par le 1 ou plus proprement True (la majuscule est importante) pour vrai et le 0 ou plus proprement False pour Faux. Bien que cela n'ai pas vraiment de sens on peut additionner multiplier etc... les True et False avec des nombres. La variable False valant alors 0 et la variable True valant 1.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(True+2)\n", "print(True+True)\n", "print( (True+True)/(False-4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

L'existence de True et False permet de réaliser, comme nous l'avons vu en cours, du calcul propositionnel. En python, il existe également les opérations de la logique, qui sont simplement la version anglophone de leur pendant français : \n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LogiqueMathPython
et$\\wedge$and
ou$\\vee$or
non$\\neg$not
\n", "

\n", "

\n", "Exercice\n", "

\n", "

Anticiper le résultat des affichages suivant et vérifier vos résultats en exécutant la case.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#1\n", "test = (True and False) \n", "print(test)\n", "\n", "#2\n", "test = (True or False) \n", "print(test)\n", "\n", "#3\n", "test = (not True or False) \n", "print(test)\n", "\n", "#4\n", "test = (not (True or False)) \n", "print(test)\n", "\n", "#5\n", "test = (not (True and not False)) \n", "print(test)\n", "\n", "#6\n", "test = (not(True and False) and (True and not False or (True and not(not False and True)))) \n", "print(test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Test sur les nombres

\n", "

On peut tester si des variables prennent des valeurs particulières ou sont plus grandes ou plus petites que ces dites valeurs. Elles sont toutes très instinctives comme sur les exemples suivants : \n", "

\n", "\n", "Une opération différe légèrement, c'est le test d'égalité. En effet le symbole = est déjà réservé en python et permet l'affectation d'une valeur à une variable. Pour tester une égalité, on utilise le double égale ==. Ainsi\n", "x=0 affecte la valeur 0 à la variable x tandis que x==0 renverra True si x est nul et False sinon.\n", "

\n", "

Il y a aussi une petite simplification de code offerte par python. Le code not (x==0) s'écrit aussi x!=0.

\n", "

\n", "Exercice\n", "

\n", "

Anticiper le résultat des affichages suivant et vérifier vos résultats en exécutant la case.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Initialisation\n", "x = 1\n", "y = 10\n", "z = 100\n", "\n", "#1\n", "Test = (10*x>y)\n", "print(Test)\n", "\n", "#2\n", "Test = (10*x>=y)\n", "print(Test)\n", "\n", "#3\n", "Test = (10*x==y)\n", "print(Test)\n", "\n", "#4\n", "Test = (x+y+z%y==x)\n", "print(Test)\n", "\n", "#5\n", "Test = ((x+y+z)%y==x)\n", "print(Test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Les exécutions conditionnelles

\n", " \n", "

Elles permettent d'exécuter un bout de code si une condition est satisfaite, un autre bout de code sinon.
\n", "

\n", " si Test est vrai alors faire :
\n", "      un bout de code
\n", " sinon faire :
\n", "      un autre bout de code
\n", "
\n", "Dont les mots clef du python sont if (pour le si) et else (pour le sinon). Il faut aussi faire suivre le test par :.\n", "ATTENTION : il est important que les bout de code soit tabulés comme dans l'exemple suivant.\n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Initialisation\n", "x = 1\n", "y = 10\n", "z = 100\n", "\n", "#Exemple 1\n", "if (x+y+z%y==x) :\n", " print(x+y+z%y==x)\n", " print(\"Le test est vrai\")\n", "else :\n", " print(x+y+z%y==x)\n", " print(\"Le test est faux\")\n", " \n", "#Exemple 2\n", "if ((x+y+z)%y==x) :\n", " print((x+y+z)%y==x)\n", " print(\"Le test est vrai\")\n", "else :\n", " print((x+y+z)%y==x)\n", " print(\"Le test est faux\")\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " La puissance des boucles\n", "
\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

La puissance de n'importe quel (bon) langage de programmation viens de ce que l'on appel des boucles. C'est à dire l'instruction qui demande de réaliser une ou plusieurs ligne de code tant qu'une certaine proposition n'est pas fausse. Le plus : l'ordinateur ne se plaindra pas si cette boucle dure mille ans !

\n", "\n", "

Il existe deux type de boucle. Pour simplifier ce cours nous n'en présentons qu'une (la plus simple). Il sagit du while qui se traduit par tant que.\n", "
\n", "

\n", " Tant que Test est vrai alors faire :
\n", "      un bout de code
\n", " sinon faire la suite\n", "
\n", "Comme pour le if, il faut faire suivre le test par : et placer le le bout de code dans une zone tabulée. Voici un exemple\n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "i=1\n", "while(i<=5) :\n", " print(i)\n", " i=i+1" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Exercice

\n", "

Pour chacune des cases suivantes, indiquer ce qu'affichera le programme et vérifier en l'éxécutant.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "i=10\n", "while(i>=0) :\n", " print(i**2)\n", " i=i-2" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "scrolled": true }, "outputs": [], "source": [ "x=1\n", "y=0\n", "while(x!=y) :\n", " print(x, y)\n", " if(x>y) :\n", " y=y+2\n", " else : \n", " x=x+1\n", "print(x, y)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a=2\n", "b=-1\n", "while(a+b==0) : \n", " print(a+b)\n", "print(a+b)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "a=1\n", "b=-1\n", "while(a+b==0) : \n", " print(a+b)\n", "print(a+b)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Numération sur les nombres entiers\n", "
\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Comme dans la vie de tous les jours pour les humains la base de numération canonique de python est la base 10. Dans cette partie nous allons nous intérésser à d'autre base. Cependant, comme python est gentil et que pour un ordinateur, le binaire, l'octal et l'héxadécimal sont usuelles, il existe des opération de conversion automatique.\n", "

\n", "Exécuter la case suivante pour observer les résultats.\n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=10\n", "\n", "#En binaire\n", "x_en_binaire=bin(x)\n", "print(x_en_binaire)\n", "\n", "#En octal\n", "x_en_octal=oct(x)\n", "print(x_en_octal)\n", "\n", "#En héxadécimal\n", "x_en_hexa=hex(x)\n", "print(x_en_hexa)\n", "\n", "#Retour en décimale\n", "print(int(0b1111111111))\n", "print(int(0o7777777777))\n", "print(int(0xFFFFFFFFFF))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Tout comme précédement, nous pouvons sur les bases $2$, $8$ et $16$ réaliser des opérations et des test en précisant bien à python laquelle de ces bases nous utilisons en indiquant le préfixe.\n", "

\n", "

\n", "

Exercices

\n", "

Avec ces informations, anticipez les résultats des opérations suivantes et vérifier les en exécutant la case.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Initialisation+opérations\n", "x=0b1010+0x10\n", "y=0b1010+0o10\n", "z=0b1010+0b10\n", "\n", "#Affichage\n", "print(x, y, z)\n", "\n", "#1\n", "if(x==26) : \n", " print(\"x vaut 26\")\n", "else : \n", " print(\"x ne vaut pas 26\")\n", "\n", "#2\n", "if(y==0x18) : \n", " print(\"y vaut 18 en base 16\")\n", "else : \n", " print(\"y ne vaut pas 18 en base 16\")\n", " \n", "#3\n", "print(bin(z))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Les autres bases

\n", "

Là, les choses se compliquent : rien n'est automatisé SAUF pour revenir en décimale. Il s'agit encore une fois de la fonction int mais avec deux paramètres : \n", "

    \n", "
  1. Le nombre quelque soit sa base, placé entre guillemets
  2. \n", "
  3. La base de ce nombre
  4. \n", "
\n", " Ainsi int(0b1010) et int(\"1010\", 2) sont équivalents.
\n", " ATTENTION : python ne pourra rien faire si vous travailler en base sexadécimale ou dans la base indienne. La plus grande base possible pour ce langage est la base 36 dont les caractères de notations sont 0, 1,...,9 puis comme pour l'héxadécimale a, b jusqu'à z (10 chiffres et 26 lettres soit une base maximale de 36).\n", "

\n", "

Vers notre prémier programme : les chaines de caractères

\n", "

A présent l'objectif est d'écrire un programme qui transforme n'importe quelle nombre en décimale en un nombre en base b quelconque que nous supposerons inférieur à 36 pour pouvoir utiliser la fonction int pour vérfier notre calcul. Mais cette fonction prend des chiffres entre guillemets. Ce n'est pas autre chose qu'une chaine de caractère. Ainsi pour python 0 est le nombre $0$ mais \"0\" est une chaine de caractère, composé du seul caractère $0$. De même \"Salut ! Ca va les mathématiques\". Comme pour les nombres nous pouvons stocker les chaines de caractères dans des variables et comme pour les nombres nous pouvons réaliser quelques opérations. Nous n'en détaillons qu'une : la concaténation qui passe par l'opération +. Prenez garde : \n", "

\n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "print(10+1)\n", "print(\"10\"+\"1\")\n", "print(\"10\"+1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Quelques petit plus : \n", "

\n", "

\n", "\n", "

Exercice

\n", "

Qu'affichera le code suivant ? Vérifiez votre résultat en exécutant la case.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=1\n", "y=10\n", "z=str(x)+str(y)\n", "t=str(y)+str(x)\n", "u=int(z)+int(t)\n", "v=str(u)\n", "print(v[len(v)-1])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Vers notre premier programme : les fonctions

\n", "

Comme pour les meilleurs films... nous avons déjà spoiler la fin (Daenerys meurt à la fin) ! Nous avons en effet déjà rencontré les fonctions en python : print, int, hex, sqrt etc. Pour définir une fonction on utilise le mot clef def suivit du nom de la fonction (qui doit respecter les même règles que les variables), puis les paramètres puis : puis le code de la fonction. Pour indiquer la valeur renvoyée par la fonction, on utilise le mot clef return qui intérompt l'appel de la fonction (donc une fonction s'intérompt si elle renvoie une valeur, soit si on arrive à la fin de ce qui la définie).

\n", "

Exercice

\n", "

Voici un exemple de fonction. Que feront les appels de la case suivante. Vérifier vos résultats en éxécutant les cases.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def mystere(f, x) :\n", " if(x<=0) : \n", " return 0\n", " x=x**2\n", " return f(x)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "x=-1\n", "print(mystere(log10, x))\n", "\n", "x=exp(2)\n", "print(mystere(log, x))\n", "\n", "x=121\n", "print(mystere(sqrt, x))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Ca y est ! Notre premier programme

\n", "

Dans la case suivante écrire la fonction ChangeBase(n, b) qui prend un entier n (que l'on supposera positif) et une base b (que l'on supposera strictement supérieur à $1$ et inférieur ou égale à $36$) et qui renvoie la chaine de caractère du nombre n en base b.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def ChangeBase(n,b) :\n", " return 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "n0 = 123 #Vous pouvez vous amuser à changer ce nombre \n", "n2 = ChangeBase(n0, 2)\n", "n8 = ChangeBase(n0, 8)\n", "n16 = ChangeBase(n0, 16)\n", "\n", "if('0b'+n2==bin(n0)) : print(\"OK\")\n", "else : print(\"Problème avec la base 2\")\n", " \n", "if('0o'+n8==oct(n0)) : print(\"OK\")\n", "else : print(\"Problème avec la base 8\")\n", " \n", "if('0x'+n16==hex(n0)) : print(\"OK\")\n", "else : print(\"Problème avec la base 16\")\n", "\n", "b=12#Vous pouvez vous amuser à changer ce nombre\n", "nb=ChangeBase(n0, b)\n", "print(\"Sinon\", n0, \"en base\", b, \"c'est\", ChangeBase(n0, b))\n", "print(\"D'ailleurs avec la fonction int on retrouve\", int(nb, b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Numération sur les nombres décimaux\n", "
\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Dans la case suivante écrire la fonction ChangeBaseDec(x, b) qui prend un nombre décimale x et une base b (que l'on supposera strictement supérieur à $1$ et inférieur ou égale à $36$) et qui renvoie la chaine de caractère du nombre x en base b. On séparera la partie décimale de la partie entière par un point.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def ChangeBaseDec(x,b) :\n", " return 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Test 1 : doit afficher c.1p\n", "x=12345/1024\n", "b=32\n", "print(x, \"en base\", b, \":\", ChangeBaseDec(x,b))\n", "\n", "#Test 2 : doit afficher 0.0001\n", "x=1/81\n", "b=3\n", "print(x, \"en base\", b, \":\", ChangeBaseDec(x,b))\n", "\n", "#Test 3 : doit afficher 0.1111111111111111111111111111111111\n", "x=1/2\n", "b=3\n", "print(x, \"en base\", b, \":\", ChangeBaseDec(x,b))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Dans la case suivante écrire la fonction ChangeBaseDecInv(x, b) qui prend un nombre décimale en base b, x (qui est une chaine de caractère) et la base b (que l'on supposera strictement supérieur à $1$ et inférieur ou égale à $36$) et qui renvoie le nombre décimale correspondant à l'écriture de x en base décimale.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "def ChangeBaseDecInv(x, b) :\n", " return 0" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Test 1\n", "x=12345/1024\n", "b=32\n", "y=ChangeBaseDecInv(ChangeBaseDec(x,b), b)\n", "if(x==y) : print(x, \"=\", y)\n", "else : print(x, \"!=\", y, \"La différence est de l'ordre de\", abs(x-y))\n", "\n", "#Test 2\n", "x=1/243\n", "b=3\n", "y=ChangeBaseDecInv(ChangeBaseDec(x,b), b)\n", "if(x==y) : print(x, \"=\", y)\n", "else : print(x, \"!=\", y, \"La différence est de l'ordre de\", abs(x-y))\n", " \n", "#Test 3\n", "x=1/2\n", "b=3\n", "y=ChangeBaseDecInv(ChangeBaseDec(x,b), b)\n", "if(x==y) : print(x, \"=\", y)\n", "else : print(x, \"!=\", y, \"La différence est de l'ordre de\", abs(x-y))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "
\n", " Graphiques en python\n", "
\n", "

\n", "

\n", " Menu de navigation\n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Première partie : les listes

\n", "

Pour pouvoir réaliser des graphiques en python, nous avons besoin de spécifier des listes (de points). La fonction de base est la fonction range qui permet très rapidement d'énumeré des entiers (et non des nombres décimaux). Voici les trois utilisations possible : \n", "

    \n", "
  1. range(n) qui donne la liste des entiers de 0 à n-1. Par exemple range(10) donnera [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
  2. \n", "
  3. range(a, b) qui donne la liste des entiers entre a et b-1. Par exemple range(3, 10) donnera [3, 4, 5, 6, 7, 8, 9]
  4. \n", "
  5. range(a, b, p) qui donne la liste des entiers entre a et b-1 par bond de p. Par exemple range(3, 10, 3) donnera [3, 6, 9]
  6. \n", "
\n", "

\n", "

\n", " Exercice\n", "

\n", "

Donner la liste des entiers entre $2000$ et $2020$ qui sont dans la table de $5$.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Il est possible de créer des listes de nombres pas forcément entiers de la manière suivante : \n", "

\n", " y=[fonction de x for x in valeur]\n", "
\n", "Dans ce cas la liste y aura dans chacune de ses cases la valeur de f(x) pour les différentes valeurs prises par x. Voici des exemples :\n", "
  1. \n", "
    \n", " y=[x**2/10 for x in range(1, 10, 2)]\n", "
    \n", "alors \n", "y=[0.1, 0.9, 2.5, 4.9, 8.1]\n", "
  2. \n", " \n", "
  3. \n", "
    \n", " z=[pow(abs(t), t/2 ) for t in range(-10, 10, 1)]\n", "
    \n", "alors \n", "z=[1e-05, 5.080526342529086e-05, 0.000244140625, 0.001101937239093957, 0.004629629629629629, 0.01788854381999832, 0.0625, 0.19245008972987526, 0.5, 1.0, 1.0, 1.0, 2.0, 5.196152422706632, 16.0, 55.90169943749474, 216.0, 907.4926996951546, 4096.0, 19683.0]\n", "
  4. \n", " \n", "
\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Seconde partie : Les graphiques

\n", "

Comme pour les fonctions, il faut définir la fenêtre de graphique. Par chance, d'autre s'en sont occupés. Chargeons cette fonctionnalité : exécuter la case suivante.

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "from matplotlib.pyplot import *" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Pour faire un graphique rien de plus simple ! On utilise la fonction plot qui prend au moins deux paramètres : \n", "

    \n", "
  1. Le premier est la liste des points d'abscisses
  2. \n", "
  3. La seconde est la liste des points d'ordonnées
  4. \n", "
\n", "Voici un exemple : \n", "

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "X=[x/10 for x in range(-10, 10)]\n", "Y=[x**3 for x in X]\n", "plot(X, Y)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Exercice

\n", "
    \n", "
  1. Dessiner la fonction exponentielle sur $[-10, 2]$
  2. \n", "
  3. Dessiner la fonction logarithme en base 10 sur $]0, 100]$
  4. \n", "
  5. Dessiner un cercle de rayon $2$
  6. \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Quelques fonctionnalités supplémentaires

\n", "\n", "\n", "

Voici un exemple qui résume tout (dans les label a été placé du code $\\LaTeX$ qui une langage d'édition d'équation compris par Jupyter. N'y prétez pas attention, et admiez le résultat).

" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#Coordonnes des points\n", "X=[x/10 for x in range(10+1)]\n", "Y=[sqrt(x) for x in X]\n", "Z=[x**2 for x in X]\n", "\n", "#Dessin\n", "plot(X, Y, 'cx-', linewidth=1.5, label=\"$x\\mapsto \\sqrt{x}$\")\n", "plot(X, Z, 'm^--', label=\"$x\\mapsto x^2$\")\n", "plot(X, X, 'r*:', label=\"$x\\mapsto x$\")\n", "\n", "#Dimension de la fenêtre\n", "xlim(0, 1)\n", "ylim(0, 1)\n", "\n", "#Titre et légende\n", "title(\"Comparaison entre $x^2$ et $\\sqrt{x}$ sur $[0; 1]$\")\n", "xlabel(\"Abscisses\")\n", "ylabel(\"Ordonnées\")\n", "legend()\n", "\n", "#Quadrillage\n", "grid(True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Exercices

\n", "
    \n", "
  1. Déssiner un carré de coté $2$ centré à l'origine du repère.
  2. \n", "
  3. Déssiner un carré de coté $2$ dont un des coins est en $(0, 0)$.
  4. \n", "
  5. Représenter les fonctions $x\\mapsto cos(x)$ et $x\\mapsto sin(x)$ sur $[-\\pi ; \\pi]$.
  6. \n", "
  7. Déssiner $x\\mapsto e^x$ et $x\\mapsto ln(x)$ entre sur $[-2 ; 4]$ (attention le logarithme n'est pas définie (normalement) sur les réels négatifs). Tracer également la droite $x\\mapsto x$.
  8. \n", "
  9. Déssiner la fonction tangante entre $\\left]-\\dfrac{\\pi}{2}; \\dfrac{\\pi}{2}\\right[$.
  10. \n", "
" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.0" } }, "nbformat": 4, "nbformat_minor": 2 }